package 网络编程;

import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

import org.apache.commons.codec.net.URLCodec;
import org.junit.jupiter.api.Test;

/*
URL编码
URL编码是浏览器发送数据给服务器时使用的编码，它通常附加在URL的参数部分，例如：

https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87

之所以需要URL编码，是因为出于兼容性考虑，很多服务器只识别ASCII字符。但如果URL中包含中文、日文这些非ASCII字符怎么办？不要紧，URL编码有一套规则：

 -如果字符是A~Z，a~z，0~9以及-、_、.、*，则保持不变；
 -如果是其他字符，先转换为UTF-8编码，然后对每个字节以%XX表示。
例如：字符中的UTF-8编码是0xe4b8ad，因此，它的URL编码是%E4%B8%AD。URL编码总是大写。
网址URL中特殊字符转义编码
字符 - URL编码值
空格 - %20
" - %22
# - %23
% - %25
& - %26
( - %28
) - %29
+ - %2B
, - %2C
/ - %2F
: - %3A
; - %3B
< - %3C
= - %3D
> - %3E
? - %3F
@ - %40
\ - %5C
| - %7C

URL特殊字符转义，URL中一些字符的特殊含义，基本编码规则如下：1、空格换成加号(+)
2、正斜杠(/)分隔目录和子目录
3、问号(?)分隔URL和查询
4、百分号(%)制定特殊字符
5、#号指定书签
6、&号分隔参数


如果需要在URL中用到，需要将这些特殊字符换成相应的十六进制的值
+ %2B
/ %2F
? %3F
% %25
# %23
& %26
*/

class URL编码 {
	@Test
	void test() throws Exception {
		// 1. URL编码 使用java.net.URLEncoder  Java标准库提供了一个URLEncoder类来对任意字符串进行URL编码
		String encoded1 = URLEncoder.encode("中文!", StandardCharsets.UTF_8);
		System.out.println(encoded1);
		String decoded2 = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", StandardCharsets.UTF_8);
		System.out.println(decoded2);
		
		// 2. 使用org.apache.commons.codec.net.URLCodec apache提供URLCodec类对字符串进行URL编码 
		URLCodec urlCodec = new URLCodec();
		//String encUrl = urlCodec.encode("http://x.com?f=哈");
		String encUrl = urlCodec.encode("http://www.example.com/?a=1&b=K&R");
		System.out.println(encUrl);
		String decUrl = urlCodec.decode(encUrl);
		System.out.println(decUrl);
		// 以上两种方式效果相同
	}
}
